Вон сколько бот ответов выдал хороших, сделай свою карту нормальную без переделок каких либо заброшек
и Ты потом не сможешь её редактировать нормально без знаний JASS. обратно триггеры тебе уже не увидеть точно, возможно придётся даже писать код в блокноте
Тем более это зомби в деревне xgm.guru/p/ziv, автор xgm.guru/user/Fakov был в сети Активность: 01.04.19 01:47
quq_CCCP, тогда ну нафиг
это полноценный реверс инженеринг уже будет Asaaaaaar, короче это потребует кучу времени и никто тут этим заниматься скорее всего не будет
думаю даже за платно сложно будет найти того кто согласится убить кучу времени на это
Нельзя. Потому что даже в твоей сугубо триггерной карте, когда запускается команда на исполнение все конвертируется в jass/( Когда ты играешь или проверяешь карту)
Триггер . лишь графическая оболочка, как бы кубики на которых написаны буквы, но все-равно все происходит на jasse ( уже иногда на lua)
Короче нельзя. скачивай jngp и учи хотя бы простые джассовые команды.
Хотя даже зная его взломанная карта часто выкладывает огромный набор проограмного кода без разделения где конкретный текстовый триггер инициализации или определенного дейсвтия.
но все делается ручками и никак иначе, данные РО еще можно восстановить, но код/триггеры в "первозданном" виде ты уже не восстановишь, только если вручную
Берем основную модель, возможно, вообще без мяса, только с гусеницами, но с кучей точек крепления. Также берем кучу моделей-аттачметов, представляющих собой эти самые пушки, корпуса и все прочее. При выборе характеристик модели через диалог или интерфейс соответственно создаем на основной модели эффекты-аттачменты, будет собрана техника. Такие штуки, как двигатель и прочие невидные извне элементы будут скорее входить в математическую модель юнита, но это также можно запилить. Название танка - сразу не скажу, есть ли триггер на смену, но на таблице рекордов можно отобразить что угодно.
2.Тоже можно.
Создаем погодный в определенной местности и делаем два триггера для контроля входа-выхода юнитов из нее. На искомых юнитов применяем нужные способности - и все готово.
Здесь чуть сложнее: нужно постоянно проверять тип местности под юнитом, но тоже можно. Проверка на ограждения тоже может бить сделана.
4.Это уже интереснее. Видел раньше подобное в играх. При каждой атаке юнита случайным образом наносим или не наносим доп. урон, эффект горения, кидаем спелл на цель в зависимости от теоретического места попадания атаки.
5.И это можно. Но нужно писать нестандартную систему Альянса. Но через триггеры и JASS все можно...
Продажа техники - лучше через способность, что бы кидать ее на понравившегося юнита, не стоит покупать кота в мешке. Стоимость должна зависеть от технического уровня юнита, его текущего состояния (мертвый танк попадет вам бесплатно, сами чините!), если он был модернизован дополнительно, то это тоже входит в стоимость. Разрешение на продажу делаем аналогично.
Это легко через Custom Value и переменние.
Как ты понял, все что ты предложил создать можно, но на это нужно потрать хороший кусок времени. Остается пожелать тебе удачи над созданием проекта - мне идея уже нравится.
Рассмотрим на примере модельки простого огра, у него есть анимация атаки slam и удар дубиной по земле
Старт атаки
Создаём упреждающий в области впереди героя (маркер, ну эффект ауры например), чтобы игрокам было понятно что скоро тут что-то произойдёт
Проигрываем анимацию "attack slam" или нужную другую, для замаха дубиной, если надо больше и не хватает стандартной скосроти, замедляем скорость анимации
Визуально подгадываем или упытным путём определяем время касания дубиной полна от 1 до 4 сек, на ваше усмотрение
Запускаем новый разовый таймер с нужным периодом, и как таймер сработает, создаём спец эффект, и наносим урон юнитам в области эффекта
(это самый простейший способ, хоть на гуи можно сделать)
когда же ты прочтёшь статьи
ибо это одно и тоже
юзай что хочешь
разницы нету предлагаю закрывать все его вопросы автоматом ибо они все по основам которые описаны в нескольких базовых статьях
Если в триггере много действий, загружающих память, то лучше не использовать малый период. А если в нём ещё утечки памяти, то рано или поздно лаги сделают игру невозможной.
По сути, и таймер, и периодическое событие запускают действия в определённое время, то есть действуют одинаково. Смотри, что тебе удобнее.
abatyr, у твоих способностей одинаковый id приказа. Нужно создать способность на основе "Канала", дать им разные id приказа, а настоящие способности кастовать даммиками.
Протестировал и сказать что лучше нельзя
ReplaceUnitBJ имеет 4 разных варианта
Добавление абилки "Тёмный" это как бы 5-й вариант замены юнита
Тут зависит от конкретного случая кого и что надо заменить.
Да, если заменять юнита на героя (или наоборот) могут возникнуть неполадки
В варике блокираторы пути 2х2 и 4х4 (маленький и большой). Воздух блочит путь для воздуха, суша для суши, двусторонний для суши и воздуха. Если в одной точке стоят 4 маленьких блокиратора, лучше заменить на один большой блокиратор. А вообще, лучше использовать вариант, который указал quq_CCCP. Там типо с фотошопом надо как-то работать, сетку желательно создать на которой будешь рисовать свой блокиратор пути... Короче на хгм есть где-то статейка, возможно найду
Razor_dex, сконвертируй карту, потом открой в стандартном 1.26 редакторе, удали комментарий Рок Лии\Otome Renge
Для гуи-гигантов это типичная болячка, просто битый комментарий который содержит в себе информацию о нескольких действиях, считай как обычный триггер только отображается как комментарий
Возникает такое скорее всего при копировании
P.S. странно что редакторы до 1.31 не обращают внимания на такой баг
Проблема решена. Я сделал так: Удалил все триггеры и потом по папочке восстанавливал, когда нашли в чем проблема удалили триггер и все заработало, спасибо за помощь!
SirDragdord, никак, последние патчи баганые, там много чего не работает, играть там не вочто, хотите поиграть - 1.26а к вашим услугам, старшие патчи вара только для ознакомления и обучения, пока не вышел рефордж там нечего делать.
Эмм что за ерунда, сократил код, убрав всё лишнее, но утечки все равно остаются, по 1.5 - 2 хэндла за каждое нанесение урона (тип хэндла не знаю как посмотреть). Когда триггер отключаешь, то всё нормально.
Сокращенный код
function SDMSCreateTextTag takes nothing returns nothing
local unit u=GetTriggerUnit()
local unit s=GetEventDamageSource()
local integer i=GetConvertedPlayerId(GetOwningPlayer(u))
local texttag tt=CreateTextTag()
local real dmg=GetEventDamage()
if ( dmg > 1.00 ) and ( dmg < 9999.00 ) then
if GetPlayerId(GetOwningPlayer(u))==12 then
call SetTextTagText(tt, "|cff9db9eb-"+I2S(R2I(dmg))+"|r", 0.023)
else
call SetTextTagText(tt, "|cffffa500-"+I2S(R2I(dmg))+"|r", 0.023)
endif
call SetTextTagPosUnit(tt, u, 0)
call SetTextTagColor(tt, 255, 255, 255, 255)
call SetTextTagVelocity(tt, 0.05325*Cos(90 * bj_DEGTORAD), 0.05325*Sin(90 * bj_DEGTORAD))
call SetTextTagPermanent(tt, false)
call SetTextTagLifespan(tt, 1.0)
call SetTextTagFadepoint(tt, 0.0)
endif
call PolledWait(2.0)
call DestroyTextTag(tt)
set u=null
set s=null
set i=0
set dmg=0
set tt=null
endfunction
function SDMSTriggerRegisterUnitDamaged takes nothing returns nothing
call TriggerRegisterUnitEvent(udg_SDMStrigger,GetEnteringUnit(),EVENT_UNIT_DAMAGED)
endfunction
function theSDMSTriggerActions takes nothing returns nothing
local trigger UnitEnter=CreateTrigger()
call TriggerRegisterEnterRectSimple(UnitEnter, gg_rct_Arena)
call TriggerAddAction(UnitEnter,function SDMSTriggerRegisterUnitDamaged)
set UnitEnter=null
endfunction
function InitTrig_the_SDMS_Trigger takes nothing returns nothing
local trigger tr=CreateTrigger()
set udg_SDMStrigger=CreateTrigger()//Тут также меняется название глобальной переменной типа триггер.
call TriggerAddAction(udg_SDMStrigger,function SDMSCreateTextTag)
call TriggerRegisterTimerEventSingle(tr,0.0)
call TriggerAddAction(tr,function theSDMSTriggerActions)
set tr=null
endfunction
Wait вызывает утечки ((
Пришлось делать через таймер
MoreDoPass, для этого и нужны массивы, чтобы было MUI
первый триггер сохраняет все нужные данные на один общий индекс, например PlantmineCount, и увеличивает этот индекс на один.
второй триггер каждые 0,0Х секунд пробегается по массиву от нуля до PlantmineCount, проверяет расстояние и если оно подходит, делает нужные действия. После этого, чтобы тот же элемент не обрабатывался заново, нужно заменить его во всех массивах на последний и уменьшить PlantmineCount на 1. И счетчик цикла тоже уменьшить на 1, иначе этот последний элемент будет пропущен тк индекс по циклу уйдет дальше.
ScorpioT1000, мне кажется, регионы он там не должен создавать =) вот точки да, а регионы же обычно берут из ныне существующих регионов. если создадим его в редакторе, его же и указывают в функции. ниче не создает.
такая гуи-команда странная, не помню такую в boolean. Типа ПРОВЕРКА что все юниты группы в регионе?
в скрине мб локалки не обнулены. там BJ-функции, раскрой и посмотри нет ли их. пример
советовал бы строить по-другому конструкцию.
если честно, не понятно, что за карту ты скинул. я тебе просто пример оптимизации на гуи показал. Но не решения ваших проблем. на jass этого бы не потребовалось, ибо на гуи приходится изворачиваться из-за ограничении команд и утечности bj-функции. там группы утекают, где-то не обнуляют/не удаляют.
Я короче более менее понял вашу ситуацию. 4триггер у вас не будет работать из-за переменной. там надо в фильтре вместо Picked unit ставить Matching Unit. С 4 примером я кажется ошибся. Там у меня по другому работает: выделяю всех из группы и нахожу рандомного юнита, а надо выделить вокруг гг, которые состоят в группе.
система урона + ледяные стрелы = при получении урона, идет проверка на бафф, удаляешь бафф и, либо кастуешь даммиком способность кислотная бомба или духовное пламя с отриц. значением минус в том что бафф будет висеть как положительный. Либо под таймером даешь даешь способность повышения защиты с отриц. значением.
Учитывая что 21 век, систему урона найти и поставить, не составит труда.
Rасательно вопроса как добавить в книгу заклинаний больше 12 скиллов - можно добавить книгу в книгу и новой книге сделать ещё несколько скиллов и ещё 1 или несколько книг. В каждую книгу можно ещё по книге и так далее.
Главное - ID приказа у всех книг должны быть разные.
Иконки способностей кольца, когтей и т.д. отображаться не будут, ты можешь отображать скиллы-пустышки, а (только это на всякий случай предложенный вариант!) герою выдавать сам предмет, предварительно вытряхнув из его инвентаря все предметы на пол. После добавления в пустой инвентарь нужного предмета, например когтей - заполняем ещё 4 слота предметами-пустышками, затем даём предмет со способностью "предметы герой", у этой способности для предмета должна стоять галочка "относится к предмету", обязательно. После этого инвентарь снова очистится уже сам, однако добавленный предмет на атаку будет иметь эффект. После чего можно подобрать с пола предметы героя и отдать ему триггерно.
Почему не стоит добавлять способность когтей триггерно? - потому что 2 добавленные одинаковые способности не суммируются. Два одинаковых предмета же суммируются.
Есть ли минусы у вышеописанного способа? - скорее всего удалить добавленный бонус нормально не выйдет. Придётся вытряхать инвентарь удалением способности "предметы герой" у самого героя, а это тот ещё геморрой -восстановить потом всё, что должно было остаться неудалённым.
Прикрепил к сообщению карту. Замена сделана на основе исследования "Ракеты" паровых танков. Думаю, как правильно копировать в свою карту, будет понятно. 8gabriel8, Он имел ввиду не иконку исследования, а вот эту иконку:
В оригинале она не меняется при исследовании улучшений. А он хочет, чтобы менялась.
Fraps, это просто утечка памяти
десинк вызывают действия происходящие локально (то есть на компьютере 1 игрока они произошли а на компьютере 2 они не происходят)
Для использования звуков, добавленных вами в карту, вы должны получить к ним доступ через редактор триггеров. После импорта файлов и добавления стандартных звуков или музыки в правую часть списка звуков их можно воспроизводить через редактор триггеров путем использования команд "Звук" - "Воспроизвести звук" или "Звук" - "Воспроизвести музыку".
Статья: xgm.guru/p/wc3/worldedit_guide_6
Это лишь минус, чтобы убирать такие декорации, нужно поставить под ними область и триггерно воспроизводить для декораций нужного типа в этой области анимацию death либо hide.
Вот примерно где находится нужное тебе действие:
У стандартных спецэффектов обычно анимации stand-обычное состояние, death-гибель, иногда birth-появление, hide-скрыть, show-показать.
Причина: причин было много, а я искал лишь одну
Самыми распространёнными оказались элементарные ошибки в коде, отсутствие параметров, параметры не того типа данных (привет динамическая типизация) или лишние параметры, из за чего происходили "рандомные рассинхроны при обрыве потока"
Огромное спасибо пользователю prog, что откликнулся и смог найти ошибки, а нашёл он их при помощи языкового сервера sumneko lua для VScode
ИИ стандартный, полагаю? Стандартному ИИ вроде как вижн не важен, он и так знает где все находятся, если мне не изменяет память. Как от него не прячься, найдет сразу. Если уж очень хочется - давать юнитов нейтралам и делать их союзным всем ботам. (игроков 16, если не изменяет память). Или давать союзным игрокам, при наличии. По крайней мере не будут мчаться в след за армией. Однако вполне могут быть более качественные решения проблемы, я стандартный ИИ не изучал, не могу быть уверен в офигительности предложенного решения. :)
Урон по дереву можно отследить с помощью хеша и дерева с 1 хп. Каждому дереву на карте поставить в соответствие n единиц жизней. При смерти дерева проигрывать анимацию получения урона и немедленно возрождать, загружать их хеша значение хп, перезаписывать его и сохранять.
Чтоб проверить что урон нанёс именно рабочий - нужно проверять наличие юнитов определённого типа вокруг дерева с соответствующим приказом, цель которого - это дерево. Для отлова цели приказа также юзается система на всё том же хеше. Нужна бд всем абилкам лесорубов.
Насчёт золота сказать трудно. Нужно посмотреть какие есть состояния юнита и какие из них связаны с пребыванием в руднике, приказы и прочее. Подозреваю что юниты вроде рабочих альянса покидают карту когда заходят в рудник. Но это нужно тестить и костылить. Чистого способа нету.
NekoriDes, мб я тупой но зачем тебе 2 триггера с один и тем же событием?
не проще ли запихнуть всё в 1 триггер
хотелось бы увидеть и функции инициализации(создание триггера, добавление событий/условий/действий)
и код лучше кидай txt/j файлом
либо юзай это
Поскольку его не пугает наличие большого влияния промахов на геймплей - скорее всего он делает рпг. Имхо в рпг всегда клево смотрятся тексттаги полученного урона, для создания которых необходимы триггеры на отлов получения урона. А отлавливаемый урон - можно и прохилить.
Для прохила(и вообще всех манипуляций с задержкой в 0.00 сек) лично я юзаю такие костыли:
Либа здесь только для доп табуляции. Я за чистый жасс + дефайны.
library ZeroTimeEvent
globals
constant integer ZTEArraySize = 64//Even 32 is alot, 64 is too much! Exactly what I need!
timer Zero//Used for 0. sec uses
integer ZTECurrent = 0
unit array ZTEUnits[ZTEArraySize]
integer array ZTEIntegers[ZTEArraySize]
real array ZTEReals[ZTEArraySize]
trigger array ZTETriggers[ZTEArraySize]
endglobals
function ZeroTimeEvent takes nothing returns nothing
loop
set ZTECurrent = ZTECurrent - 1
call TriggerExecute( ZTETriggers[ZTECurrent] )
exitwhen ZTECurrent < 1
endloop
endfunction
#define ZTEAddUnit(u) = {
set ZTEUnits[ZTECurrent] = u
}
#define ZTEAddInteger(i) = {
set ZTEIntegers[ZTECurrent] = i
}
#define ZTEAddReal(r) = {
set ZTEReals[ZTECurrent] = r
}
#define ConfirmZTE(trig) = {
set ZTETriggers[ZTECurrent] = trig
set ZTECurrent = ZTECurrent + 1
call TimerStart( Zero, ZeroTime, false, function ZeroTimeEvent )
}
endlibrary
Никак. Регионы и области не сравниваются параметрически, то есть координатами, которые покрывают. Но можно узнать, находится ли точка в том или ином регионе. То есть, в твоем примере, проверить, находится ли юнит одновременно и в tempReg и в tempReg2.
у парня проблемы с алгоритмом, в какой вселенной 0.01 * 10 не 0.1?
В компьютерной. И да, 0.01 * 10 тоже может быть не равно 0.01 + ... + 0.01. Потому что складываются и умножаются real по-разному. Hate, надо просто использовать целочисленные, или пользоваться ==, в JASS == округляет числа для сравнения (!= не округляет).
Пороверил разные варианты, сразу упомяну, что с целочисленными всё огонь, просто какие-то другие воспоминания с ними всплывали. PT153, сначала не понял, зачем мне твоя строчка, она всего лишь выдавала 0.1 вместо 0.100, но тестировал разные варианты и всё прояснилось. Если задавать шаг 1.0, то всё исправно считается до 10.0, если задавать шаг 0.2, то всё считается до 2.2 и отображается ровно, но если сделать шаг 1.01, то вот тут и появляется то, ради чего ты эту строчку дал.
Именно с дробной частью косяк, и теперь не знаю как выбрать лучший ответ, по идее у тебя в каждом комментарии полезная информация. Просто объединил их в итоге.
Способность некоторых зданий ночных эльфов, "Сьесть дерево" в настройках способности есть параметры за кол-во полученого здоровья и времени за которое оно будет восстановлено.
FabulousTiger, большенству людей сложно влиться в чужой проект если тот абсолютно не отвечает некоторым критериям либо человеку может просто не нравится задумка. И это далеко не та ситуация когда нужно проглотить свое негодование, уровень роботы такого человека будет напрямую зависеть от того насколько ему нравится проект. KaneThaumaturge, твоя скорость изучения JASS будет напрямую зависеть от того насколько ты в это захочешь втянуться. Правда должен предупредить что есть люди которые просто не приспособлены к тому что-бы понять програмирование в его ярчайшем проявлении, такие люди обычно при разработке проекта опираются на то что умею лучше всего.
Я из опыта скажу что: есть некоторые вещи которые возможно создать только при помощи JASS, но реализацию большенства идей можно выполнить при помощи GUI. Покопайся в чужих наработка пойми что ты хочешь и что можешь использовать из предоставленного тебе и вперед делать проект.
но условие можно переделать как угодно...например для входящего юнита в область это только пример того как записать диалог в таблицу и очищать хэндл чтобы не вызвал утечек NazarPunk:
с помощью кода включить нужную анимацию у юнита, разумеется анимация должна быть у модели, у старых варовских моделей анимация разговора была лишь на портрете, это отдельная модель, кроме всяких крипов с мордами в 3 полигона.
Достать то можно - что толку, они имеют иной формат, с ними ниче сделать низя, публичного софта для редактирования и изучения нет, поэтому рефорджевские модели никому и ненужны - ты с ними ниче и не сделаешь.
а) Создай 2 переменные-массива по типу "боевая единица" (массив - чтобы для каждого игрока, мы ведь за мультиплеер трем, прально?), назови типа MyChampion и MyChampionDummy.
б) подготовь невидимого героя-пустышку с нужной тебе иконкой, убери ману, если у чемпиона ее нет. Убери ему радиус обзора, убери галочки типа "отмечать на мини-карте" - остальные - опционально.
В дальнейшем мы будем синхронизировать пустышку и реального чемпиона, создавая видимость одной боевой единицы.
Итак, наш первый триггер:
в) Отследи первое появление чемпиона, когда это случится - создай для игрока героя-пустышку. Соответственно сделай MyChampion [number of (Owner of trained unit)]= last trained unit, следующей строчкой создай того самого героя-пустышку для (owner of trained unit) и сделай MyChampionDummy = last created unit. Теперь мы прочно связали этих чуваков. Этот же триггер запускает остальные.
г) Отслеживание здоровья. Сделай изначально выключенный цикличный триггер, там, каждые 0.3 секунды. Триггер запускается пунктом в). Каждые 0.3 секунды меняй здоровье героя (чья икона висит, надо чтобы она соответствовала, прально?) в % на здоровье самого чемпиона.
д) пропищи событие, мол, если выбирает игрок своего героя (кликая на иконку) выбирается чемпион
е) убивай героя вместе с чемпионом
ж) отключай триггеры с проверкой и выбором, пока чемпион мертв
з) не забывай обновлять переменную чемпиона с каждым новым чемпионом.
Честно я не знаю меняет родная защита и прочие характеристики юнита при использовании тёмный. Давно не игрался с этим. Да и делал я типа кур. Говорят там только модель меняется. А вот перевоплощение да там могут меняться атрибуты и прочее. Если так то редактируйте этого юнита. И вообще проверяйте сами все
При использовании абилы тёмный сам юнит никуда не удаляется, просто модель меняется (сам даже удалял много ещё) - трудно проверить?
А почему ты не можешь просто сделать так,чтобы предмет с твоей броней просто одевался на героя.Это самый простой вариант,в котором есть только одна проблема-найти/сделать модель этого предмета.
Работаю с ВоВ-моделью. Проще сделать много скинов к ней, как в самой ММО, чем модель брони.
а) Создай 2 переменные-массива по типу "боевая единица" (массив - чтобы для каждого игрока, мы ведь за мультиплеер трем, прально?), назови типа MyChampion и MyChampionDummy.
б) подготовь невидимого героя-пустышку с нужной тебе иконкой, убери ману, если у чемпиона ее нет. Убери ему радиус обзора, убери галочки типа "отмечать на мини-карте" - остальные - опционально.
В дальнейшем мы будем синхронизировать пустышку и реального чемпиона, создавая видимость одной боевой единицы.
Итак, наш первый триггер:
в) Отследи первое появление чемпиона, когда это случится - создай для игрока героя-пустышку. Соответственно сделай MyChampion [number of (Owner of trained unit)]= last trained unit, следующей строчкой создай того самого героя-пустышку для (owner of trained unit) и сделай MyChampionDummy = last created unit. Теперь мы прочно связали этих чуваков. Этот же триггер запускает остальные.
г) Отслеживание здоровья. Сделай изначально выключенный цикличный триггер, там, каждые 0.3 секунды. Триггер запускается пунктом в). Каждые 0.3 секунды меняй здоровье героя (чья икона висит, надо чтобы она соответствовала, прально?) в % на здоровье самого чемпиона.
д) пропищи событие, мол, если выбирает игрок своего героя (кликая на иконку) выбирается чемпион
е) убивай героя вместе с чемпионом
ж) отключай триггеры с проверкой и выбором, пока чемпион мертв
з) не забывай обновлять переменную чемпиона с каждым новым чемпионом.
Вобщем, с какого-то ... не работал цикл. Пришлось поставить просто подряд много повторяющихся действий (развернуть цикл и прописать отдельно каждое из его повторений), так заработало. Странный этот редактор...
При осмотре карты тоже не совсем понял почему игра перестает строительство. Как решение, ты можешь даммику строительства поменять расу на нежить, таким образом уже здание само будет достраиваться.
Поскольку у тебя на карте при беглом осмотре юнитов строителей я не заметил, то выше указанное решение как раз то что нужно тебе.
П.С.
Под какую версию игры рассчитана данная карта?
Идеальный вариант чтобы игрок сам мог решать, нужно ли ему это. Сделай, если будет смотреться неплохо. И каким то образом запилить возможность выключения этой фичи.
Проблема решена. Обнаружилась довольно неожиданно - заметил, что во время крита герой не разбивал лицо сам себе, начал искать модификаторы атаки - у героя было 3 пустышки с нулевыми значениями на основе "ракет". При всех пустых значениях вылетает невидимая ракета по самому себе.
Рассмотрим на примере модельки простого огра, у него есть анимация атаки slam и удар дубиной по земле
Старт атаки
Создаём упреждающий в области впереди героя (маркер, ну эффект ауры например), чтобы игрокам было понятно что скоро тут что-то произойдёт
Проигрываем анимацию "attack slam" или нужную другую, для замаха дубиной, если надо больше и не хватает стандартной скосроти, замедляем скорость анимации
Визуально подгадываем или упытным путём определяем время касания дубиной полна от 1 до 4 сек, на ваше усмотрение
Запускаем новый разовый таймер с нужным периодом, и как таймер сработает, создаём спец эффект, и наносим урон юнитам в области эффекта
(это самый простейший способ, хоть на гуи можно сделать)
Юзать структуры, свои собственные системы хранения данных.
Если вы только решили слезть с гуи+ вейты на jass, то вам рано думать о таком.
Таймер + хештаблицы в помощь, в статьях есть много информации на эту тему.
Что вам еще непонятно? ImbaStyle, что есть TriggerSleepActions и timer вам известно?
Нельзя просто использовать таймер вместо вейта посередине триггера (гуишный вейт именно так и работает - запускает таймер и проверяет циклом каждые 0.1 сек пока он не пройдет).
Но если так уж нужно узнать истек ли таймер:
Real comparison - Обратный отсчет - Remaining time for timer (оставшееся время таймера)
Ну если у тебя через локалку что-то неправильно иногда работает, значит просто у тебя где-то ошибка (или ты вообще делаешь это не так).
Для того что бы работать парой таймер+юнит впринципе то больше ничего и не нужно - таймер и сам юнит. Но если у тебя должно запускаться параллельно несколько точно таких же таймеров, то тут может подойти массив таймеров (и массив юнитов). При срабатывании одного из таймеров ты можешь ссылаться на юнита записанного под тем же индексом массива ( unit[X] и timer[X] соответственно).
А ещё в триггер можно добавлять события на срабатывания новых таймеров.
ваш домик должен состоять из несколько частей: крыша и стены. Короче это два ваших юнита (крыша и стены). Для начала вам нужно уметь моделировать или попросить модельщика. Можно просто модель готового домика взять (например ферма) и разделить на две части. Трудного ничего нет.
Еще забыл сказать про полы, но это всегда не важная часть. Но пол наверное можно поднять, но поднимать удобнее, если играешь один. А то второй игрок заходит, а пола нет. Для мультиплеера лучше статичный пол
Берем эти модели и даем их двум зданиям, из которых сделаны эти модели. У крыши и стен убираем карту путей, тип движения ставим "нет". Это влияет на движение, просто просто если это не убрать, то юниты упираются в преграду или не могут ставится друг на друга. вот здесь про проходимость и карту путей прочесть можно Только 1 юниту можно перерисовать карту путей (ты смотрел ссылку выше? ладно => xgm.guru/p/wc3/pathing-alternate). Можно снаружи поставить стенки, внутри пустошь. Обычно рисуют прямоугольниками и квадратиками и извнутри тоже все зарисовано, и внутрь юнит никогда не можешь зайти, тк упирается в преграду. Только воздух норм ходит. А если перерисовать так, чтоб были стены и проход внутрь.
есть крыша и стены. когда юнит входит внутрь, то крышу можно делать прозрачной. Короче юнита прозрачным делаем. Можно через гетлокалплеер. Но для этого нужно зарегистрировать, как-то проверить что юнит входит в область
прямоугольником (областью) участок земли должен зарегистрирован в область. Есть даже событие. Правда там область пихают в регион, и на регион вешают событие входа/выхода. Когда юнит входит, крышу делаем прозрачной, и видим что делает там юнит. Когда выходит, прозрачность возвращаем.
Если дом имеет больше 1 этажа, придется делать стены выше, полы 2 этажа.
Есть летающие юниты, которые могут подниматься над декорацией. Это тоже можно использовать. Например движение по лестнице на второй этаж и так далее
Вроде эту систему можно посмотреть тут<= в этой системе юнит может по бочками прыгать и подниматься выше по ним. Можно сделать лестницу какую нибудь. Все зависит от модели, если лестница имеет платформу по наклонной, то и юнит будет лететь по наклонной. Все что надо это тип движения поменять. А меняем через морф
теперь нужно чтобы этот домик можно было разрушить: это проще простого. домик состоит из двух частей: стен и крыши. Короче два здания. По идее крыша это просто декор, и делаем ее неуязвимой. Страдают только стены. По идее юнит должен бить по стенам. Как извнутри не знаю, но должен бить по стенам также. Еще чтобы крыша горела вместе с стенами, то можно вместе с стенами хп отнимать.
Вообще на это влияют пустышки горениясм. раздел пустышки
Ключевые кадры - КК обозначены на шкале анимации синим, если ты попал в этот кадр, то его номер справа из чёрного станет столь же синим. Например, анимация длится 2000 кадров, от 1000 до 3000 на шкале, а охота сократить её вдвое, для этого просто посчитаю новую позицию КК. Пусть после начального следующий КК стоит на месте 1333, потом 1500 и так далее; для определения позиции вычитаю 1000, делю примерно на два, прибавляю 1000, так первый кадр должен сместиться с 1333 на 1167; попадаю на шкале в 1333, нажимаю C или Ctrl+C, перехожу на 1167 и нажимаю Ctrl+V, а потом убираю кадр на 1333, что можно сделать, попав в него и нажав Del, либо выделив участок с ним и в меню по правой клавише нажав Очистить. Не помню точно, но с выделением на шкале есть какие-то особенности, либо там тянуть выделение надо не левой кнопкой мыши, а правой, либо не всегда срабатывает с первого раза, либо с начала шкалы или до конца не выделяется, в любом случае можешь просто щёлкнуть в одно место, зажать Shift и щёлкнуть во второе место для выделения. Далее 1500 нужно перенести на 1250, всё опять повторяешь. И так до конца шкалы. Потом длительности анимации указываешь не с 1000 до 3000, а с 1000 до 2000.
Как вариант, можно не менять длительность анимации, а сдвинуть пораньше КК, где юнит наносит урон, типа замах укоротить.
P. S. Сначала было очень неудобно это выполнять, но после смещения нескольких шкал анимаций стало получаться весьма шустро. Только нужно постоянно быть внимательным, чтобы не сбиться в расчётах нового местоположения КК, и помнить, чтобы не удалять КК на старом месте раньше установки на новое, а ещё, что C или Ctrl+C были точно нажаты для этого кадра, а не остались от предыдущего)
всё тему можно закрывать, пару раз сделал то же самое и о чудо всё заработало, в общем спишем на кривизну конвертера :D
P. S. если усидчивости хватит то ожидайте это чудо в разделе модели)
EDIT:
Im terrible sorry but in later wc3 version this model wont work as I planned, apperently teamcolored attatchments wont change color anymore so this model is more or less fucked, im planning on makeing a full series of glows for eatch color but im not sure that i would get approwed here so don't hope to much, once again im sorry.
Но вероятно это только с этой моделью, ибо у меня в wizards world все работает как надо.
Самое простое - отредактировать стандартные лучи. Сделать их максимально толстыми наверху и обычными пониже, увеличить количество частиц в секунду и время жизни. Можно и переблёскивающийся оттенок сделать сверху на середину.
Если правильно настроить угол падения, то можно добиться, чтобы лучи были видны только по краям камеры.Поищи статью про погоду. Хотя можешь воспользоваться этой картой, но там нет пояснений, только файл погоды и путь.
Редактировать удобнее через SLKEditor
Если мне память не изменяет, то в вк3 можно сделать либо синфазный партикль, либо XY партикль. Последний делается проставлением галочки в соответствующей колонке в магосе (модел эдиторе)
Если XY неподходит, то есть смысл подумать над тем, как-бы сделать такой эффект мешем.
не очень понимаю "Zap'ов", напишите подробно пожалуйста
Он имеет ввиду молнии, как я понимаю. Те, которые используют текстуру zap что-то там .blp
Интересно посмотреть над чем ты там работаешь кстати!
По идее там ничего сложного нет. Первый триггер при срабатывании способности объединяет нужное количество юнитов в радиусе действия в [массив], далее всех этих юнитов скрывает, а на месте каждого создаётся дамми с подходящей моделькой (судя по скрину, Волна Силы), которым тоже назначается переменная [массив], индексы массива дамми приравниваются индексам массива юнитов, на месте которых они созданы. Дамми вносятся в группу, которая получает приказ следовать к позиции кастера, после чего включается второй триггер. Второй триггер должен ловить приказ СТОП для юнитов в группе. То есть дамми не должны никак иначе сменить приказ, раз они москиты, лишь при достижении цели пути. Так вот триггер отлавливает приказ стоп у юнита в группе, мгновенно переносит на место москита соответствующего юнита из параллельного массива, делает его видимым, убивает этого москита и убирает из группы. Последним действием проверяется, что если юнитов в группе 0, то удалить группу и отключить триггер.
Надо ещё эффекты нужные подставить и такая система рассчитана на одного юнита с этой способностью, чтобы сделать её MUI, надо потестировать, получают ли дамми при создании приказ СТОП, если нет, тогда отключение и включение второго триггера не требуется и триггер надо лишь немного переделать, а если да, то надо подумать и потестировать.
Там все гораздо проще, на каждого юнита аттачится экземпляр структуры где хранится цель, заклинатель, кол-во урона в сек, и сколько хп у тебя было, по нему высчитывается урон каждые 4 секунды. Тебе ни 10 таймеров ни группы не нужны.
function WC5 takes nothing returns boolean
local trigger t = GetTriggeringTrigger( )
local integer S5I = GetHandleId( t )
local unit P7I = ( LoadUnitHandle( HashData, ( S5I ), ( 2 ) ) )
local unit P8I = ( LoadUnitHandle( HashData, ( S5I ), ( 17 ) ) )
local integer SUI = GetUnitAbilityLevel( P7I, 'A0NO' )
local integer NPI = GetTriggerEvalCount( t )
local real WD5 = ( LoadReal( HashData, ( S5I ), ( 392 ) ) )
local real H84 = 0
if GetTriggerEventId( ) == EVENT_WIDGET_DEATH then
call DestroyEffect( ( LoadEffectHandle( HashData, ( S5I ), ( 32 ) ) ) )
call FlushChildHashtable( HashData, ( S5I ) )
call S0I( t )
else
if NPI == 4 or NPI == 8 or NPI == 12 then
call DestroyEffect( ( LoadEffectHandle( HashData, ( S5I ), ( 32 ) ) ) )
if NPI == 12 then
call FlushChildHashtable( HashData, ( S5I ) )
call S0I( t )
elseif NPI == 4 or NPI == 8 then
call SaveEffectHandle( HashData, ( S5I ), ( 32 ), ( AddSpecialEffectTarget( "effects\\NetherInferno.mdx", P8I, "origin" ) ) )
endif
set H84 = ( 0.08 + SUI * 0.08 ) * QDI( WD5 - GetUnitState( P8I, UNIT_STATE_LIFE ), 0 )
if H84 > 0 then
call UYI( "+" + I2S( R2I( H84 ) ), 2, P8I, 0.023, 68, 0, 187, 216 )
endif
endif
call DamageTarget( P7I, P8I, 1, 5 * SUI + H84 )
endif
set t = null
set P7I = null
set P8I = null
return false
endfunction
function WE5 takes nothing returns nothing
local trigger t = CreateTrigger( )
local integer S5I = GetHandleId( t )
local unit P7I = GetTriggerUnit( )
local unit P8I = GetEnumUnit( )
call DestroyEffect( AddSpecialEffectTarget( "effects\\NetherInferno.mdx", P8I, "origin" ) )
call TriggerRegisterTimerEvent( t, 1, true )
call TriggerRegisterDeathEvent( t, P8I )
call TriggerAddCondition( t, Condition( function WC5 ) )
call SaveUnitHandle( HashData, ( S5I ), ( 17 ), ( P8I ) )
call SaveUnitHandle( HashData, ( S5I ), ( 2 ), ( P7I ) )
call SaveReal( HashData, ( S5I ), ( 392 ), ( ( GetUnitState( P8I, UNIT_STATE_LIFE ) ) * 1.0 ) )
call SaveEffectHandle( HashData, ( S5I ), ( 32 ), ( AddSpecialEffectTarget( "effects\\NetherInferno.mdx", P8I, "origin" ) ) )
set t = null
set P7I = null
set P8I = null
endfunction
function WF5 takes nothing returns nothing
local unit P7I = GetTriggerUnit( )
local location l = GetSpellTargetLoc( )
local real x = GetLocationX( l )
local real y = GetLocationY( l )
local group g = NTI( )
local integer SUI = GetUnitAbilityLevel( P7I, 'A0NO' )
call GroupEnumUnitsInRange( g, x, y, 180 + 25, Condition( function D01 ) )
call ForGroup( g, function WE5 )
call NSI( g )
call RemoveLocation( l )
set l = null
set g = null
endfunction
function WG5 takes nothing returns boolean
if GetSpellAbilityId( ) == 'A0NO' then
call WF5( )
endif
return false
endfunction
function NI1 takes nothing returns nothing
local trigger t = CreateTrigger( )
call UMI( t, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( t, Condition( function WG5 ) )
set t = null
endfunction
Как видишь все очень примитивно.Точно так же делаешь структуру с данными кто, где, когда. Нет смысла пытатся хранить сразу группу.
» WarCraft 3 / Взлом карты
» WarCraft 3 / Реалистичный снаряд
» WarCraft 3 / Что лучше использовать?
» WarCraft 3 / Проблема с редактором 1.26
» WarCraft 3 / Проблема с редактором
» WarCraft 3 / Перемещение Иллюзий
» WarCraft 3 / Туман войны
» WarCraft 3 / Wait until
» WarCraft 3 / Иконка атаки, защиты.
» WarCraft 3 / Музыка на карте
» WarCraft 3 / Как забыть улучшение
» WarCraft 3 / Приказ добычи ресурсов
» WarCraft 3 / Два уровня предмета?
» WarCraft 3 / Сравнение Триггеров
» WarCraft 3 / Как использовать vJass и cJass?
» WarCraft 3 / ИИ и диалоги
» WarCraft 3 / Помогите вспомнить карту!
» WarCraft 3 / Пассивные иконки Рефоржа
» WarCraft 3 / Помощь с триггерами
» WarCraft 3 / Система полета снарядов
» WarCraft 3 / Таймер вместо вейт
» WarCraft 3 / Сломалась кампания
» WarCraft 3 / mdlVis
» WarCraft 3 / Эффект свечения
» WarCraft 3 / Наложение Таймеров